package com.demo.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spi.service.contexts.ApiSelector;
import springfox.documentation.spring.web.plugins.Docket;

import javax.annotation.PostConstruct;

/**
 * Swagger2的定制化配置类
 *
 * @author yexi
 */

@Configuration
public class Swagger2Configuration {
    @Autowired
    private ConfigurableBeanFactory beanFactory;

    /**
     * Docket: 一个构建器，旨在生成 swagger-springmvc 框架的主要接口。提供合理的默认值和方便的配置方法。
     * 这里初始化多个 Docket 的 Bean 用于做对比，一般而言一个项目一个bean就够了
     *
     * @see ApiSelector#DEFAULT 默认 Api 选择器。
     */
    @PostConstruct
    public void docketBeanInit() {
        for (int i = 1; i <= 5; i++) {
            Docket docket = this.baseDocket(i);
            switch (i) {
                case 1:
                    docket
                            // 接口信息
                            .apiInfo(apiInfo())
                            // 开启api选择器，通过该选择器可以选择扫描指定位置的swagger注解
                            .select()
                            // 只扫描指定包中的swagger注解
                            .apis(RequestHandlerSelectors.basePackage("com.demo.controller.api1"))
                            // 路径过滤器
                            .paths(PathSelectors.any())
                            .paths(PathSelectors.ant("/**"))
                            .build();
                    break;
                case 2:
                    docket
                            .apiInfo(new ApiInfoBuilder().build())
                            .select()
                            // 扫描所有包
                            .apis(RequestHandlerSelectors.any()).build();
                    break;
                case 3:
                    docket.select()
                            // 全部都不扫描
                            .apis(RequestHandlerSelectors.none())
                            .build();
                    break;
                case 4:
                    // 是否启用该组。默认为 true。
                    docket.enable(false);
                default:
                    break;
            }
            beanFactory.registerSingleton("docket" + i, docket);
        }
    }

    private Docket baseDocket(int i) {
        return new Docket(DocumentationType.SWAGGER_2).groupName("第" + i + "个组");
    }

    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                // 创建人
                .contact(contact())
                // 版本号
                .version("1.0")
                // 描述
                .description("Swagger的测试项目")
                // 页面标题
                .title("Swagger在线文档")
                // 网站服务条款
                .termsOfServiceUrl("http://localhost:8080/")
                .license("Apache 2.0")
                .licenseUrl("http://www.apache.org/licenses/LICENSE-2.0")
                .build();
    }

    /**
     * 此 API 的创建人信息
     */
    private Contact contact() {
        return new Contact("yexi", "www.yexi.com", "www.yexi.com");
    }


}
